import os
import re
import sys
import tqdm
import shutil
import pathlib
import check_config


# Получение имени пользователя системы
def get_system_user():
    return os.environ['USERNAME']


# Проверка на игнорируемые каталоги приложений
def ignoring_application_paths(path_list, app_paths):
    check_list = []
    path_list = [path for path in path_list]
    for ignore_path in app_paths.values():
        reg_exp = r'\/{}\/'.format(ignore_path)
        for path in path_list:
            if len(re.findall(reg_exp, str(path))) == 0:
                check_list.append(path)
    return check_list


# Проверка на игнорируемые каталоги пользователя
def ignoring_user_paths(path_list, user_paths):
    check_list = [path for path in path_list]
    for user_path in user_paths:
        if user_path in check_list:
            check_list.remove(user_path)
    return check_list


# Исключение скрытых каталогов
def exclude_hidden_folders(paths):
    path_list = []
    reg_exp = r'/\.\w+\/'
    for path in paths:
        if path is not None and len(re.findall(reg_exp, str(path))) == 0:
            path_list.append(path)
    return path_list


# Удаление самих каталогов
def delete_folders(path_list):
    for item in tqdm.tqdm(path_list, ncols=80, desc='Удаление папок'):
        try:
            shutil.rmtree(item)
        except FileNotFoundError:
            pass


# Удаление файлов внутри каталогов
def delete_files(path_list):
    files = []
    for p in path_list:
        for item in pathlib.Path(p).rglob('*'):
            if item.is_file():
                files.append(item)
    files = set(files)
    for file in tqdm.tqdm(files, ncols=80, desc='Удаление файлов'):
        file.unlink()


# Получить все пути по заданным шаблонам
def get_all_paths(conf):
    collection = []
    check_list = []

    # Собирает все пути по паттернам заданным в настройках
    for pattern in conf['patterns']:
        check_list += conf['default']['home_dir'].rglob(f'{pattern}')

    # Проверка и исключение путей пользователя
    if conf['iup'] is not None:
        check_list = ignoring_user_paths(check_list, conf['iup'])

    # Проверка и исключение путей программ пользователя
    if conf['iap'] is not None:
        check_list = ignoring_application_paths(check_list, conf['iap'])

    # Проверка и исключение скрытых путей
    if conf['default']['exclude_hidden']:
        check_list = exclude_hidden_folders(check_list)
        collection += check_list
    else:
        check_list = [path for path in check_list]
        collection += check_list
    print(f'[collection] {len(collection)}')
    return set(collection)


def help():
    print(
        """
python rmtff.py [args]
        
    -f, --file      - Удаление файлов в папках.
    -F, --folder    - Удаление папок.
    -h, --help      - Подсказка.
        """
    )


def start(*args):
    print('[GetPath] Сбор путей.')
    paths = get_all_paths(args[-1])
    print(f'[+] Сбор выполнен. {len(paths)} путей в работе.')
    if args.count('file'):
        delete_files(paths)
    elif args.count('folder'):
        delete_folders(paths)


def main():
    print('[CheckConfig] Проверка файла с настройками.')
    config = check_config.check()
    if config is not None:
        print('[+] Проверка выполнена.')
        print('[CheckArguments] Проверка аргументов.')
        if sys.argv.count('-F') or sys.argv.count('--folder'):
            print('[+] Проверка выполнена.')
            start('folder', config)
        elif sys.argv.count('-f') or sys.argv.count('--file'):
            print('[+] Проверка выполнена.')
            start('file', config)
        elif sys.argv.count('-h') or sys.argv.count('--help'):
            print('[+] Проверка выполнена.')
            help()
        else:
            print('Не передано ни одного нужного аргумента. Подсказка -h.')


if __name__ == '__main__':
    main()
